JavaScript একটি ইভেন্ট-ড্রিভেন এবং অ্যাসিনক্রোনাস প্রোগ্রামিং ভাষা। এর মানে হল যে, JavaScript একাধিক কাজ একসাথে করতে সক্ষম (যেমন ডেটাবেস থেকে তথ্য আনা, ফাইল পড়া, বা API কল করা) এবং এটি **অ্যাসিনক্রোনাস (Asynchronous)**ভাবে কাজ করে, যার মাধ্যমে কোডের অন্যান্য অংশ একে অপরকে ব্লক না করে কার্যকরীভাবে চালানো যায়।
এই অ্যাসিনক্রোনাস কার্যক্রমগুলো সাধারণত তিনটি প্রধান কৌশল দ্বারা পরিচালিত হয়:
- Callbacks
- Promises
- Async/Await
এখানে আমরা প্রতিটি কৌশল সম্পর্কে বিস্তারিতভাবে আলোচনা করব।
১. Callbacks
Callback হল একটি ফাংশন যা অন্য একটি ফাংশনের প্যারামিটার হিসেবে পাস করা হয় এবং মূল ফাংশনটির কার্যক্রম শেষ হওয়ার পর সেটি কল (বা ট্রিগার) করা হয়। JavaScript এ অ্যাসিনক্রোনাস ফাংশনের জন্য callback ব্যবহার করা হয়, যেমন ফাইল পড়া, নেটওয়ার্ক কল করা বা টাইমআউট ব্যবস্থাপনা।
উদাহরণ:
// একটি সিম্পল callback ফাংশন
function fetchData(callback) {
setTimeout(() => {
const data = "Data fetched";
callback(data); // Callback ফাংশন কল করা
}, 2000);
}
function processData(data) {
console.log("Processing: " + data);
}
fetchData(processData); // Callback ফাংশন পাস করাএখানে fetchData ফাংশনটি একটি ডেটা ফেরত দেয়, এবং যখন সেটি ফেরত আসে, তখন processData callback ফাংশনটি ট্রিগার হয়।
সমস্যা:
Callbacks সাধারণত Callback Hell তৈরি করতে পারে, যেখানে একাধিক কলব্যাক ফাংশন একে অপরের মধ্যে nest হয়ে যায়, এবং কোড আরও জটিল হয়ে যায়।
২. Promises
Promise হল একটি JavaScript অবজেক্ট যা ভবিষ্যতে একটি অ্যাসিনক্রোনাস অপারেশনের ফলাফল বা ত্রুটি উপস্থাপন করে। এটি অ্যাসিনক্রোনাস কাজের জন্য একটি পরিষ্কার এবং পরিচালনাযোগ্য পদ্ধতি প্রদান করে। Promise একটি অবজেক্ট হতে পারে যা fulfilled (সফল), rejected (ব্যর্থ), বা pending (অপেক্ষমাণ) অবস্থায় থাকে।
উদাহরণ:
// Promise ব্যবহার
function fetchData() {
return new Promise((resolve, reject) => {
setTimeout(() => {
const data = "Data fetched";
resolve(data); // Promise সফল হলে
}, 2000);
});
}
fetchData().then(data => {
console.log("Processing: " + data);
}).catch(error => {
console.log("Error: " + error);
});এখানে, fetchData একটি Promise ফেরত দেয়। যখন এটি সফলভাবে কাজ সম্পন্ন করে, তখন .then() ব্লকটি কল হয়, এবং যদি কোনো ত্রুটি ঘটে তবে .catch() ব্লকটি কল হয়।
সুবিধা:
- Callback Hell সমস্যা কমায়।
- কন্ট্রোল স্ট্রাকচার পরিষ্কার এবং সহজে বুঝতে সুবিধাজনক।
- একাধিক অ্যাসিনক্রোনাস অপারেশন একসাথে পরিচালনা করতে
.all(),.race()ইত্যাদি ব্যবহার করা যায়।
৩. Async/Await
Async/Await হল ES2017 (ES8) তে পরিচিত একটি সিনট্যাক্স যা Promises ব্যবহারের উপর ভিত্তি করে কাজ করে, তবে এটি আরও সরল এবং সিনক্রোনাস কোডের মতো দেখতে হয়। async ফাংশনটি একটি Promise ফেরত দেয় এবং await কিওয়ার্ডটি Promise এর ফলাফল পাওয়ার জন্য অপেক্ষা করে।
উদাহরণ:
// Async/Await ব্যবহার
async function fetchData() {
const data = await new Promise((resolve, reject) => {
setTimeout(() => {
resolve("Data fetched");
}, 2000);
});
console.log("Processing: " + data);
}
fetchData();এখানে, fetchData একটি async ফাংশন, এবং await এর মাধ্যমে Promise এর ফলাফল আসা পর্যন্ত কোড অপেক্ষা করে, যা সিনক্রোনাস কোডের মতো মনে হয়, তবে আসলে এটি অ্যাসিনক্রোনাস।
সুবিধা:
- কোডটি সহজ এবং পড়তে সহজ।
- Callback Hell এবং Promise chaining এর থেকে মুক্তি দেয়।
- কোড আরও পরিষ্কার এবং ডিজাইন করার সময় কমপ্লেক্সিটি কম হয়।
Callbacks, Promises, এবং Async/Await এর তুলনা
| বৈশিষ্ট্য | Callbacks | Promises | Async/Await |
|---|---|---|---|
| অ্যাসিনক্রোনাস প্রোগ্রামিং | হ্যাঁ, তবে callback hell তৈরি হতে পারে | হ্যাঁ, তবে chaining এর মাধ্যমে কাজ করা যায় | হ্যাঁ, সহজ এবং পরিষ্কারভাবে ব্যবহার করা যায় |
| প্রবাহ নিয়ন্ত্রণ | Nested, জটিল হতে পারে | .then() এবং .catch() এর মাধ্যমে পরিচালিত | await ব্যবহার করে সাধারণ সিনক্রোনাস কোডের মতো পরিচালিত |
| কোডের জটিলতা | জটিল, code structure পরিষ্কার নয় | মাঝামাঝি, তবে .then() এবং .catch() এর মাধ্যমে পরিষ্কার হয় | পরিষ্কার, সিনক্রোনাস কোডের মতো |
| ফলাফল | সরাসরি ফেরত দেয় না | Promise (fulfilled বা rejected) ফেরত দেয় | Promise ফেরত দেয়, তবে await দ্বারা ফলাফল পাওয়া যায় |
| সহজতা | বেশি জটিল এবং অভ্যস্ত হতে পারে | তুলনামূলক সহজ, তবে chaining হয় | সবচেয়ে সহজ, সিনক্রোনাস কোডের মতো |
সারাংশ
- Callbacks: একটি ফাংশন যা অন্য ফাংশনের শেষে কল করা হয়। তবে এটি Callback Hell তৈরি করতে পারে।
- Promises: অ্যাসিনক্রোনাস কাজের জন্য একটি পরিষ্কার এবং ব্যবস্থাপনারযোগ্য সমাধান। এটি কন্ট্রোল স্ট্রাকচার পরিষ্কার করে এবং
.then(),.catch()ব্যবহার করে ফলাফল বা ত্রুটি পরিচালনা করা যায়। - Async/Await: Promises এর ওপর ভিত্তি করে, যা কোড লেখার জন্য একটি সহজ এবং সোজা পদ্ধতি প্রদান করে। এটি সিনক্রোনাস কোডের মতো দেখায়, তবে এটি অ্যাসিনক্রোনাস অপারেশন পরিচালনা করে।
Async/Await সাধারণত সবচেয়ে ভালো পদ্ধতি হিসাবে বিবেচিত হয় কারণ এটি কোড লেখার সময় সর্বাধিক সহজ এবং পরিষ্কার।
Read more